<!DOCTYPE html>
<html lang="zh-Hans">
<head>
  <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2">
<meta name="theme-color" content="#222">
<meta name="generator" content="Hexo 4.2.1">
  <link rel="apple-touch-icon" sizes="180x180" href="/blog/images/apple-touch-icon-next.png">
  <link rel="icon" type="image/png" sizes="32x32" href="/blog/images/favicon-32x32-next.png">
  <link rel="icon" type="image/png" sizes="16x16" href="/blog/images/favicon-16x16-next.png">
  <link rel="mask-icon" href="/blog/images/logo.svg" color="#222">

<link rel="stylesheet" href="/blog/css/main.css">


<link rel="stylesheet" href="/blog/lib/font-awesome/css/all.min.css">

<script id="hexo-configurations">
    var NexT = window.NexT || {};
    var CONFIG = {"hostname":"gujinyu102.gitee.io","root":"/blog/","scheme":"Muse","version":"7.8.0","exturl":false,"sidebar":{"position":"left","display":"post","padding":18,"offset":12,"onmobile":false},"copycode":{"enable":false,"show_result":false,"style":null},"back2top":{"enable":true,"sidebar":false,"scrollpercent":false},"bookmark":{"enable":false,"color":"#222","save":"auto"},"fancybox":false,"mediumzoom":false,"lazyload":false,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"algolia":{"hits":{"per_page":10},"labels":{"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}},"localsearch":{"enable":false,"trigger":"auto","top_n_per_article":1,"unescape":false,"preload":false},"motion":{"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}}};
  </script>

  <meta name="description" content="至于requirejs大家都是很熟悉的了，它的打包工具r.js是非常好用，也非常强大的，但是建于它的配置参数比较多，这里列出一份所有参数的中文详解，方便理解和记忆。 appDir: “some&#x2F;path&#x2F;” （选填）app的顶级目录。如果指定该参数，说明您的所有文件都在这个目录下面（包括baseUrl和dir都以这个为根目录）。如果不指定，则以baseUrl参数为准 baseUrl: ”.&#x2F;” 模">
<meta property="og:type" content="article">
<meta property="og:title" content="requirejs压缩工具r.js的build.js配置详解">
<meta property="og:url" content="https://gujinyu102.gitee.io/blog/2016/12/08/requirejs-e5-8e-8b-e7-bc-a9-e5-b7-a5-e5-85-b7r-js-e7-9a-84build-js-e9-85-8d-e7-bd-ae-e8-af-a6-e8-a7-a3/index.html">
<meta property="og:site_name" content="辜锦宇的博客">
<meta property="og:description" content="至于requirejs大家都是很熟悉的了，它的打包工具r.js是非常好用，也非常强大的，但是建于它的配置参数比较多，这里列出一份所有参数的中文详解，方便理解和记忆。 appDir: “some&#x2F;path&#x2F;” （选填）app的顶级目录。如果指定该参数，说明您的所有文件都在这个目录下面（包括baseUrl和dir都以这个为根目录）。如果不指定，则以baseUrl参数为准 baseUrl: ”.&#x2F;” 模">
<meta property="article:published_time" content="2016-12-08T07:07:00.000Z">
<meta property="article:modified_time" content="2020-06-09T09:04:30.486Z">
<meta property="article:author" content="辜锦宇">
<meta name="twitter:card" content="summary">

<link rel="canonical" href="https://gujinyu102.gitee.io/blog/2016/12/08/requirejs-e5-8e-8b-e7-bc-a9-e5-b7-a5-e5-85-b7r-js-e7-9a-84build-js-e9-85-8d-e7-bd-ae-e8-af-a6-e8-a7-a3/">


<script id="page-configurations">
  // https://hexo.io/docs/variables.html
  CONFIG.page = {
    sidebar: "",
    isHome : false,
    isPost : true,
    lang   : 'zh-Hans'
  };
</script>

  <title>requirejs压缩工具r.js的build.js配置详解 | 辜锦宇的博客</title>
  






  <noscript>
  <style>
  .use-motion .brand,
  .use-motion .menu-item,
  .sidebar-inner,
  .use-motion .post-block,
  .use-motion .pagination,
  .use-motion .comments,
  .use-motion .post-header,
  .use-motion .post-body,
  .use-motion .collection-header { opacity: initial; }

  .use-motion .site-title,
  .use-motion .site-subtitle {
    opacity: initial;
    top: initial;
  }

  .use-motion .logo-line-before i { left: initial; }
  .use-motion .logo-line-after i { right: initial; }
  </style>
</noscript>

</head>

<body itemscope itemtype="http://schema.org/WebPage">
  <div class="container use-motion">
    <div class="headband"></div>

    <header class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-container">
  <div class="site-nav-toggle">
    <div class="toggle" aria-label="Toggle navigation bar">
      <span class="toggle-line toggle-line-first"></span>
      <span class="toggle-line toggle-line-middle"></span>
      <span class="toggle-line toggle-line-last"></span>
    </div>
  </div>

  <div class="site-meta">

    <a href="/blog/" class="brand" rel="start">
      <span class="logo-line-before"><i></i></span>
      <h1 class="site-title">辜锦宇的博客</h1>
      <span class="logo-line-after"><i></i></span>
    </a>
  </div>

  <div class="site-nav-right">
    <div class="toggle popup-trigger">
    </div>
  </div>
</div>




<nav class="site-nav">
  <ul id="menu" class="main-menu menu">
        <li class="menu-item menu-item-home">

    <a href="/blog/" rel="section"><i class="fa fa-home fa-fw"></i>Home</a>

  </li>
        <li class="menu-item menu-item-archives">

    <a href="/blog/archives/" rel="section"><i class="fa fa-archive fa-fw"></i>Archives</a>

  </li>
  </ul>
</nav>




</div>
    </header>

    
  <div class="back-to-top">
    <i class="fa fa-arrow-up"></i>
    <span>0%</span>
  </div>


    <main class="main">
      <div class="main-inner">
        <div class="content-wrap">
          

          <div class="content post posts-expand">
            

    
  
  
  <article itemscope itemtype="http://schema.org/Article" class="post-block" lang="zh-Hans">
    <link itemprop="mainEntityOfPage" href="https://gujinyu102.gitee.io/blog/2016/12/08/requirejs-e5-8e-8b-e7-bc-a9-e5-b7-a5-e5-85-b7r-js-e7-9a-84build-js-e9-85-8d-e7-bd-ae-e8-af-a6-e8-a7-a3/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/blog/images/avatar.gif">
      <meta itemprop="name" content="辜锦宇">
      <meta itemprop="description" content="">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="辜锦宇的博客">
    </span>
      <header class="post-header">
        <h1 class="post-title" itemprop="name headline">
          requirejs压缩工具r.js的build.js配置详解
        </h1>

        <div class="post-meta">
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="far fa-calendar"></i>
              </span>
              <span class="post-meta-item-text">Posted on</span>

              <time title="Created: 2016-12-08 15:07:00" itemprop="dateCreated datePublished" datetime="2016-12-08T15:07:00+08:00">2016-12-08</time>
            </span>
              <span class="post-meta-item">
                <span class="post-meta-item-icon">
                  <i class="far fa-calendar-check"></i>
                </span>
                <span class="post-meta-item-text">Edited on</span>
                <time title="Modified: 2020-06-09 17:04:30" itemprop="dateModified" datetime="2020-06-09T17:04:30+08:00">2020-06-09</time>
              </span>

          

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">

      
        <p>至于requirejs大家都是很熟悉的了，它的打包工具r.js是非常好用，也非常强大的，但是建于它的配置参数比较多，这里列出一份所有参数的中文详解，方便理解和记忆。</p>
<p>appDir: “some/path/”</p>
<p>（选填）app的顶级目录。如果指定该参数，说明您的所有文件都在这个目录下面（包括baseUrl和dir都以这个为根目录）。如果不指定，则以baseUrl参数为准</p>
<p>baseUrl: ”./”</p>
<p>模块所在默认相对目录。如果baseUrl指定不明确，所有被加载的模块都相对于生成目录。如果appDir被指定，baseUrl将相对于appDir目录。</p>
<p>mainConfigFile: “../some/path/to/main.js”</p>
<p>配置文件地址。默认所有的优化配置都在命令行或者配置文件里，而通过requirejs的data-main引入配置文件的方式是不起作用的。当然，如果你不想重复声明配置，可以直接通过这个参数指向data-main的文件。文件中的第一个requirejs({})，require({})，requirejs.config({})或者require.config({})方法调用会被用到。在2.1.10版本中，mainConfigFile可以是数组，并且后指定的值会覆盖先指定的值。</p>
<p>paths: { “foo.bar”: “../scripts/foo/bar”, “baz”: “../another/path/baz” }</p>
<p>设置模块的路径。相对路径以baseUrl为当前目录。如果是”empty:”则指向一个空文件。使优化器在输出时不会包含该文件。对于指向CDN或者其它在浏览器中运行的http:URL的模块有用，在优化过程中它应该被跳过因为它没有依赖项。</p>
<p>map: {}</p>
<p>建立一个模块到其它模块的ID地图</p>
<p>packages: []</p>
<p>配置CommonJS包，查看<a href="http://requirejs.org/docs/api.html#packages" target="_blank" rel="noopener">http://requirejs.org/docs/api.html#packages</a></p>
<p>dir: “../some/path”</p>
<p>输出目录。如果不指定，默认会创建一个build目录，相对于生成文件所在的目录。</p>
<p>keepBuildDir: false</p>
<p>在2.0.2版本中，dir指向的目录在生成开始之前会被删除。如果你有一个大型的生成项目并且不会通过onBuildRead/onBuildWrite改变源文件，你可以使用这个参数来保持原目录，这样可以让重新生成时更快速，但是如果生成的代码被某种方式改变的话，可能会导致未知的错误。</p>
<p>shim: {}</p>
<p>如果shim配置在requirejs运行过程中被使用的话，需要在这里重复声明，这样才能将依赖模块正确引入。最好是使用mainConfigFile指定配置文件，这样就可以只在一个地方声明。当然，如果mainConfigFile没有声明，shim配置就必须声明。</p>
<p>wrapShim: false</p>
<p>在2.1.11版本中，shim的依赖可以包含在define()里。具体参见：<a href="http://requirejs.org/docs/api.html#config-shim" target="_blank" rel="noopener">http://requirejs.org/docs/api.html#config-shim</a></p>
<p>Locale: “en-us”</p>
<p>使用i18n源文件指定语言</p>
<p>optimize: “uglify”</p>
<p>默认会压缩所有js文件，closure|none</p>
<p>skipDirOptimize: false</p>
<p>2.1.2中提到，如果使用dir作为输出目录，优化器会优化输出目录的所有JS（包括没有在modules配置中声明的）。当然，如果没有在modules里面声明的JS文件在生成过后不会被使用你可以跳过这些文件，以加快生成速度。将该参数设置为true来跳过这些不用被生成的JS文件。</p>
<p>generateSourceMaps: false</p>
<p>在2.1.2中是实验性质。</p>
<p>normalizeDirDefines: “skip”</p>
<p>2.1.11中：如果dir被声明且不为”none”，并且skipDirOptimize 为false，通常所有的JS文件都会被压缩，这个值自动设置为”all”。为了让JS文件能够在压缩过正确执行，优化器会加一层define()调用并且会插入一个依赖数组。当然，这样会有一点点慢如果有很多文件或者有大文件的时候。所以，设置该参数为”skip”这个过程就不会执行，如果optimize设置为”none”也一样。如果你想手动设置值的话： 1）优化后：如果你打算压缩没在modules声明的JS文件，在优化器执行过后，你应该设置这个值为”all” 2）优化中：但在动态加载过后，你想做一个会文件优化，但不打算在动态加载这些文件可以设置成”skip” 最后：所有生成的文件（无论在不在modules里声明过）自动标准化</p>
<p>uglify: { toplevel: true, ascii_only: true, beautify: true, max_line_length: 1000, defines: { DEBUG: [“name”, “false”] }, no_mangle: true }</p>
<p>如果用UglifyJS做优化，这些配置参数会被传递到UglifyJS，详情见：<a href="https://github.com/mishoo/UglifyJS" target="_blank" rel="noopener">https://github.com/mishoo/UglifyJS</a></p>
<p>Uglify2: { output: { beautify: true }, compress: { sequences: false, global_defs: { DEBUG: false } }, warnings: true, mangle: false }</p>
<p>如果用UglifyJS2来优化，这些配置参数会被传入UglifyJS2</p>
<p>closure: { CompilerOption: {}, CompilationLevel: “SIMPLE_OPTIMIZATIONS”, loggingLevel: “WANING” }</p>
<p>如果用Closure Compiler优化，这个参数可以用来配置Closure Compiler，详细请看Closure Compiler的文档</p>
<p>optimizeCss: “standard.keepLines.keepWhitespace</p>
<p>允许优化CSS，参数值： “standard”: @import引入并删除注释，删除空格和换行。删除换行在IE可能会出问题，取决于CSS的类型 “standard.keepLines”: 和”standard”一样但是会保持换行 “none”: 跳过CSS优化 “standard.keepComments”: 保持注释，但是去掉换行(r.js 1.0.8+) “standard.keepComments.keepLines”: 保持注释和换行(r.js 1.0.8+) “standard.keepWhitespace”: 和”standard”一样但保持空格</p>
<p>cssImportIgnore: null</p>
<p>如果optimizeCss可用，列出需要忽略@import的文件。值应该是以逗号分隔的CSS文件名（例：”a.css,b.css”，文件名必须和@import的相同</p>
<p>cssIn: “path/to/main.css”, out: “path/to/css-optimized.css”</p>
<p>cssIn是用在命令行的类型参数，它可以单独使用来优化单个CSS文件</p>
<p>cssPrefix: “”</p>
<p>如果”out”和”cssIn”不是同一目录，并且在cssIn文件里面有url()相对目录的，用这个去设置URL前置。仅仅在优化后URL不正确的情况下使用。</p>
<p>inlineText: true</p>
<p>内联所有文本和依赖，避免多次异步请求这些依赖</p>
<p>userStrict: false</p>
<p>允许“user strict”，用来包含RequireJS文件。默认为false是因为没有多少浏览器能够准确的处理ES5的strict mode错误，并且还有很多遗留代码在strict mode里面不能运行。</p>
<p>pragmas: { fooExclude: true }</p>
<p>指定生成编译指示。如果源文件包含类似如下注释： &gt;&gt;excludeStart(“fooExlude”, pragmas.fooExclude); &gt;&gt;excludeEnd(“fooExclude”); 那么以//&gt;&gt;开头的注释就是编译指示。excludeStart/excludeEnd和includeStart/includeEnd起作用，在includeStart或excludeStart中的编译指示值将参与计算来判断Start和End之前的编译指示是include还是exclude。如果你可以选择用”has”或编译指示，建议用”has”代替。 编译指示比较难于阅读，但是它在对代码移除上比较灵活。基于”has”的代码必须遵守JavaScript规则。编译指示还可以在未压缩的代码中删除代码，而”has”只能通过UglifyJS或者Closure Compiler来做。</p>
<p>pragmasOnSave: { excludeCoffeeScript: true }</p>
<p>和”pragmas”一样，但只能在文件保存的优化阶段应用一次。”pragmas”可以同时在依赖映射和文件保存优化阶段应用。有些”pragmas”可能不会在依赖映射时被执行，例如在CoffeeScript的loader插件中，只想CoffeeScript做依赖映射，但是一旦这个文件被保存为一个javascript文件，CoffeeScript compiler就没用了。那样的话，pragmasOnSave就会用于在保存期排除编译代码。</p>
<p>has: { “function-bind”: true, “string-trim”: false }</p>
<p>使用”has”允许trimming代码树。基于js的特征检测：<a href="https://github.com/phiggins42/has.js" target="_blank" rel="noopener">https://github.com/phiggins42/has.js</a>。代码树修饰仅仅在使用UglifyJS或Closure Compiler压缩时发生。更多请见：<a href="http://requirejs.org/docs/optimization.html#hasjs" target="_blank" rel="noopener">http://requirejs.org/docs/optimization.html#hasjs</a></p>
<p>hasOnSave: { “function-bind”: true, “string-trim”: false }</p>
<p>和pragmasOnSave类似</p>
<p>namespace: “foo”</p>
<p>允许requirejs名称空间，使require和define换作新的名字。更多见：<a href="http://requirejs.org/docs/faq-advanced.html#rename" target="_blank" rel="noopener">http://requirejs.org/docs/faq-advanced.html#rename</a></p>
<p>skipPragmas: false</p>
<p>跳过执行pragmas</p>
<p>skipModuleInsertion: false</p>
<p>如果是false，文件就不会用define()来定义模块而是用一个define()占位符插入其中。另外，require.pause/resume调用也会被插入。设置为”true”来避免。这个参数用在你不是用require()来创建项目或者写js文件，但是又想使用RquireJS的优化工具来合并模块是非常有用的。</p>
<p>stubModules: [“text”, “bar”]</p>
<p>将模块排除在优化文件之外。</p>
<p>optimizeAllPluginResources: false</p>
<p>如果不是一个文件的优化，描述输出目录的所有.js文件的插件依赖，如果这个插件支持优化成为一个单独的文件，就优化它。可能是一个比较慢的优化过程。仅仅在有些插件用了像XMLHttpRequest不支持跨域，并且生成的代码会被放在另一个域名。</p>
<p>findNestedDependencies: false</p>
<p>寻找require()里面的require或define调用的依赖。默认为false是因为这些资源应该被认为是动态加载或者实时调用的。当然，有些优化场景也需要将它们合并在一起。</p>
<p>removeCombined: false</p>
<p>如果设置为true，在输出目录将会删除掉已经合并了的文件</p>
<p>modules: [ ①{ name: “foo/bar/bop”, create: true, override: { pragmas: { fooExclude: true } } }, ②{ name: “foo/bar/bop”, include: [“foo/bar/bee”] }, ③{ name: “foo/bar/bip”, exclude: [“foo/bar/bop”] }, ④{ name: “foo/bar/bin”, excludeShallow: [“foo/bar/bot”] }, ⑤{ name: “foo/barz”, insertRequire: [“foo/baz”] } ]</p>
<p>列出要优化的模块。如果有依赖i18n的，只有root层会被包含进来除非locale:块在上面被声明过。 ①仅定义模块会被转换成一个生成目标文件的名字，包含所有依赖项。i18n依赖同上， create：true可用来生成在源文件目录不存在的给定模块名。如果源文件目录已经存在一个相同名称的模块，create参数就没用了； override:可以重写全局的pragmas ②这个模块声明编译foo/bar/bop的所有依赖和foo/bar/bee及其所有依赖 ③编译所有foo/bar/bip的依赖到一个文件，但是排除foo/bar/bop和它的所有依赖文件，如果想把另一个模块单独优化，这是一个很好用的方法 ④excludeShallow只排除掉这个模块，但是如果输出模块的依赖和它有相同就保留不排除。 ⑤这个模块声明表示用insertRequire（在2.0中新加入）</p>
<p>insertRequire: [“foo/bar/bop”]</p>
<p>如果目标模块在顶层级只调用了define没有调用require()，并且输出文件在data-main中使用，如果顶层没有require，就不会有任何模块被加载。定义insertRequire在文件尾部来执行其它模块，更多参见：<a href="https://github.com/jrburke/almond" target="_blank" rel="noopener">https://github.com/jrburke/almond</a></p>
<p>name: “foo/bar/bop”, include: [“foo/bar/bee”], insertRequire: [“foo/bar/bop”], out: “path/to/optimized-file.js”</p>
<p>如果只优化一个模块（和它的依赖项），而且是生成一个单文件，你可以在行内定义模块的选项，以代替modules参数的定义方式，”exclude”, “excludeShallow”, “include”和”insertRquire”都可以以兄弟属性的方式定义</p>
<p>deps: [“foo/bar/bee”]</p>
<p>“include”的替换方案。一般用requirejs.config()来定义并用mainConfigFile引入。</p>
<p>out: function( text, sourceMapText ) { }</p>
<p>在2.0，”out”可以是一个函数， 对单个JS文件优化可以调用requirejs.optimize()， 用out函数表示优化过后的内容不会被写到磁盘，而是传递给out函数。</p>
<p>out: “stdout”</p>
<p>在2.0.12+， 设置”out”为”stdout”， 优化输出会写到STDOUT，这对于r.js整合其它命令行工具很有用。为了避免额外的输出”logLevel: 4”应该被使用。</p>
<p>wrap: { start: “(function() {“, end: “}())” }</p>
<p>wrap任何东西在start和end之间，用于define/require不是全局的情况下，在end里可以暴露全局对象在文件中。</p>
<p>wrap: true</p>
<p>wrap的另一种方式，默认是(function() { + content + }())</p>
<p>wrap: { startFile: “parts/start.frag”, “endFile: “parts/end.frag” }</p>
<p>用文件来wrap</p>
<p>wrap: { startFile: [“parts/startOne.frag”, “parts/startTwo.frag”], endFile: [“parts/endOne.frag”, “parts/endTwo.frag”] }</p>
<p>多个文件的wrap</p>
<p>fileExclusionRegExp: /^\./</p>
<p>跳过任何以.开头的目录和文件，比如.files, .htaccess等</p>
<p>preserveLicenseComments: true</p>
<p>默认注释有授权在里面。当然，在大项目生成时，文件比较多，注释也比较多，这样可以把所有注释写在文件的顶部。</p>
<p>logLevel: 0</p>
<p>设置logLevel。 TRACE: 0, INFO: 1 WARN: 2 ERROR: 3 SILENT: 4</p>
<p>throwWhen: { optimize: true }</p>
<p>在2.1.3，有些情况下当错误发生时不会抛出异常并停止优化，你可能想让优化器在某些错误发生时停止，就可以使用这个参数</p>
<p>onBuildRead: function( moduleName, path, contents) { return contents.replace(/foo/g, “bar”); }</p>
<p>当每个文件被读取的时候调用这个方法来改变文件内容</p>
<p>onBuildWrite: function( moduleName, path, contents) { return contents.replace(/bar/g, “foo”); }</p>
<p>允许在写入目标文件前执行方法改变内容</p>
<p>onModuleBundleComplete: function( data) { }</p>
<p>每个JS模块集完成后执行。 模块集是指一个modules数组项。</p>
<p>rawText: { “some/id”: “define([‘another/id’], function () {} ); “ }</p>
<p>在2.1.3，种子raw text是模块ID的列表。这些文本内容用于代替模块的文件IO调用。用于模块ID是基于用户动态输入的情况，在网页生成工具中常用。</p>
<p>cjsTranslate: true</p>
<p>在2.0.2中。如果为true, 优化器会添加define(require, exports, module) {})；包裹每一个没有调用define()的文件。</p>
<p>useSourceUrl: true</p>
<p>在2.0.2，有点实验性质。每一个模块集最后都会添加一段//# sourceUrl的注释。</p>
<p>waitSeconds: 7</p>
<p>定义模块的加载时间。</p>
<p>skipSemiColonInsertion: false</p>
<p>在2.1.9，通常r.js插入一个分号在文件末尾，如果没有的话。</p>
<p>keepAmdefine: false</p>
<p>在2.1.10， 如果是true，就不会删除amdefine，详情见：<a href="https://github.com/jrburke/amdefine" target="_blank" rel="noopener">https://github.com/jrburke/amdefine</a></p>
<p>allowSourceOverwrites: false</p>
<p>在2.1.11中， 作为修复BUG的一部分<a href="https://github.com/jrburke/r.js/issues/444" target="_blank" rel="noopener">https://github.com/jrburke/r.js/issues/444</a>。设置为true就允许源代码进行重写覆盖。当然，为了安全起见，请正确配置，比如你可能想设置”keepBuildDir”为true。</p>

    </div>

    
    
    

      <footer class="post-footer">

        


        
    <div class="post-nav">
      <div class="post-nav-item">
    <a href="/blog/2016/12/08/plupload-e4-bd-bf-e7-94-a8-e6-96-87-e6-a1-a3/" rel="prev" title="Plupload使用文档">
      <i class="fa fa-chevron-left"></i> Plupload使用文档
    </a></div>
      <div class="post-nav-item">
    <a href="/blog/2016/12/08/e5-89-8d-e7-ab-af-e5-b7-a5-e7-a8-8b-e5-8c-96-e7-a0-94-e7-a9-b6-ef-bc-88-e4-b8-80-ef-bc-89/" rel="next" title="前端工程化研究（一）">
      前端工程化研究（一） <i class="fa fa-chevron-right"></i>
    </a></div>
    </div>
      </footer>
    
  </article>
  
  
  



          </div>
          

<script>
  window.addEventListener('tabs:register', () => {
    let { activeClass } = CONFIG.comments;
    if (CONFIG.comments.storage) {
      activeClass = localStorage.getItem('comments_active') || activeClass;
    }
    if (activeClass) {
      let activeTab = document.querySelector(`a[href="#comment-${activeClass}"]`);
      if (activeTab) {
        activeTab.click();
      }
    }
  });
  if (CONFIG.comments.storage) {
    window.addEventListener('tabs:click', event => {
      if (!event.target.matches('.tabs-comment .tab-content .tab-pane')) return;
      let commentClass = event.target.classList[1];
      localStorage.setItem('comments_active', commentClass);
    });
  }
</script>

        </div>
          
  
  <div class="toggle sidebar-toggle">
    <span class="toggle-line toggle-line-first"></span>
    <span class="toggle-line toggle-line-middle"></span>
    <span class="toggle-line toggle-line-last"></span>
  </div>

  <aside class="sidebar">
    <div class="sidebar-inner">

      <ul class="sidebar-nav motion-element">
        <li class="sidebar-nav-toc">
          Table of Contents
        </li>
        <li class="sidebar-nav-overview">
          Overview
        </li>
      </ul>

      <!--noindex-->
      <div class="post-toc-wrap sidebar-panel">
      </div>
      <!--/noindex-->

      <div class="site-overview-wrap sidebar-panel">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
  <p class="site-author-name" itemprop="name">辜锦宇</p>
  <div class="site-description" itemprop="description"></div>
</div>
<div class="site-state-wrap motion-element">
  <nav class="site-state">
      <div class="site-state-item site-state-posts">
          <a href="/blog/archives/">
        
          <span class="site-state-item-count">5</span>
          <span class="site-state-item-name">posts</span>
        </a>
      </div>
  </nav>
</div>



      </div>

    </div>
  </aside>
  <div id="sidebar-dimmer"></div>


      </div>
    </main>

    <footer class="footer">
      <div class="footer-inner">
        

        

<div class="copyright">
  
  &copy; 
  <span itemprop="copyrightYear">2020</span>
  <span class="with-love">
    <i class="fa fa-heart"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">辜锦宇</span>
</div>
  <div class="powered-by">Powered by <a href="https://hexo.io/" class="theme-link" rel="noopener" target="_blank">Hexo</a> & <a href="https://muse.theme-next.org/" class="theme-link" rel="noopener" target="_blank">NexT.Muse</a>
  </div>

        








      </div>
    </footer>
  </div>

  
  <script src="/blog/lib/anime.min.js"></script>
  <script src="/blog/lib/velocity/velocity.min.js"></script>
  <script src="/blog/lib/velocity/velocity.ui.min.js"></script>

<script src="/blog/js/utils.js"></script>

<script src="/blog/js/motion.js"></script>


<script src="/blog/js/schemes/muse.js"></script>


<script src="/blog/js/next-boot.js"></script>




  















  

  

</body>
</html>
